#include "app_svbmp.hpp"

#if (defined(HITSIC_USE_APP_SVBMP) && (HITSIC_USE_APP_SVBMP > 0))

/*!
 * @addtogroup svbmp
 * @{
 */

#define BMP_GRAY_COLORS(x) (uint32_t)((x)|(x<<8)|(x<<16))

__PACKED // __attribute__ ((__packed__))
typedef struct tagBITMAPFILEHEADER {
	/* bmfh 14bytes */
	uint16_t bfType;
	uint32_t bfSize;
	uint16_t bfReserved1;
	uint16_t bfReserved2;
	uint32_t bfOffBits;
} BITMAPFILEHEADER;

__PACKED // __attribute__ ((__packed__))
typedef struct tagBITMAPINFOHEADER {
	/* bmih 54bytes */
	BITMAPFILEHEADER bmfh;
	uint32_t biSize;
	int32_t biWidth;
	int32_t biHeight;
	uint16_t biPlanes;
	uint16_t biBitCount;
	uint32_t biCompression;
	uint32_t biSizeImage;
	int32_t biXPelsPerMeter;
	int32_t biYPelsPerMeter;
	uint32_t biClrUsed;
	uint32_t biClrImportant;
} BITMAPINFOHEADER;

__PACKED
typedef struct tagBITMAPGRAYHEADER {
	/* bmgh 1080bytes */
	//BITMAPINFOHEADER bmif;
	uint32_t bmColors[256];
} BITMAPGRAYHEADER;

__PACKED
typedef struct tagBITMAPRGBHEADER {
	/* bmrh 72bytes */
	//BITMAPINFOHEADER bmif;
	uint32_t bmColors[4];
} BITMAPRGBHEADER;

const BITMAPGRAYHEADER bmp_gray_color_palette = {
BMP_GRAY_COLORS(0),BMP_GRAY_COLORS(1),BMP_GRAY_COLORS(2),BMP_GRAY_COLORS(3),
BMP_GRAY_COLORS(4),BMP_GRAY_COLORS(5),BMP_GRAY_COLORS(6),BMP_GRAY_COLORS(7),
BMP_GRAY_COLORS(8),BMP_GRAY_COLORS(9),BMP_GRAY_COLORS(10),BMP_GRAY_COLORS(11),
BMP_GRAY_COLORS(12),BMP_GRAY_COLORS(13),BMP_GRAY_COLORS(14),BMP_GRAY_COLORS(15),
BMP_GRAY_COLORS(16),BMP_GRAY_COLORS(17),BMP_GRAY_COLORS(18),BMP_GRAY_COLORS(19),
BMP_GRAY_COLORS(20),BMP_GRAY_COLORS(21),BMP_GRAY_COLORS(22),BMP_GRAY_COLORS(23),
BMP_GRAY_COLORS(24),BMP_GRAY_COLORS(25),BMP_GRAY_COLORS(26),BMP_GRAY_COLORS(27),
BMP_GRAY_COLORS(28),BMP_GRAY_COLORS(29),BMP_GRAY_COLORS(30),BMP_GRAY_COLORS(31),
BMP_GRAY_COLORS(32),BMP_GRAY_COLORS(33),BMP_GRAY_COLORS(34),BMP_GRAY_COLORS(35),
BMP_GRAY_COLORS(36),BMP_GRAY_COLORS(37),BMP_GRAY_COLORS(38),BMP_GRAY_COLORS(39),
BMP_GRAY_COLORS(40),BMP_GRAY_COLORS(41),BMP_GRAY_COLORS(42),BMP_GRAY_COLORS(43),
BMP_GRAY_COLORS(44),BMP_GRAY_COLORS(45),BMP_GRAY_COLORS(46),BMP_GRAY_COLORS(47),
BMP_GRAY_COLORS(48),BMP_GRAY_COLORS(49),BMP_GRAY_COLORS(50),BMP_GRAY_COLORS(51),
BMP_GRAY_COLORS(52),BMP_GRAY_COLORS(53),BMP_GRAY_COLORS(54),BMP_GRAY_COLORS(55),
BMP_GRAY_COLORS(56),BMP_GRAY_COLORS(57),BMP_GRAY_COLORS(58),BMP_GRAY_COLORS(59),
BMP_GRAY_COLORS(60),BMP_GRAY_COLORS(61),BMP_GRAY_COLORS(62),BMP_GRAY_COLORS(63),
BMP_GRAY_COLORS(64),BMP_GRAY_COLORS(65),BMP_GRAY_COLORS(66),BMP_GRAY_COLORS(67),
BMP_GRAY_COLORS(68),BMP_GRAY_COLORS(69),BMP_GRAY_COLORS(70),BMP_GRAY_COLORS(71),
BMP_GRAY_COLORS(72),BMP_GRAY_COLORS(73),BMP_GRAY_COLORS(74),BMP_GRAY_COLORS(75),
BMP_GRAY_COLORS(76),BMP_GRAY_COLORS(77),BMP_GRAY_COLORS(78),BMP_GRAY_COLORS(79),
BMP_GRAY_COLORS(80),BMP_GRAY_COLORS(81),BMP_GRAY_COLORS(82),BMP_GRAY_COLORS(83),
BMP_GRAY_COLORS(84),BMP_GRAY_COLORS(85),BMP_GRAY_COLORS(86),BMP_GRAY_COLORS(87),
BMP_GRAY_COLORS(88),BMP_GRAY_COLORS(89),BMP_GRAY_COLORS(90),BMP_GRAY_COLORS(91),
BMP_GRAY_COLORS(92),BMP_GRAY_COLORS(93),BMP_GRAY_COLORS(94),BMP_GRAY_COLORS(95),
BMP_GRAY_COLORS(96),BMP_GRAY_COLORS(97),BMP_GRAY_COLORS(98),BMP_GRAY_COLORS(99),
BMP_GRAY_COLORS(100),BMP_GRAY_COLORS(101),BMP_GRAY_COLORS(102),BMP_GRAY_COLORS(103),
BMP_GRAY_COLORS(104),BMP_GRAY_COLORS(105),BMP_GRAY_COLORS(106),BMP_GRAY_COLORS(107),
BMP_GRAY_COLORS(108),BMP_GRAY_COLORS(109),BMP_GRAY_COLORS(110),BMP_GRAY_COLORS(111),
BMP_GRAY_COLORS(112),BMP_GRAY_COLORS(113),BMP_GRAY_COLORS(114),BMP_GRAY_COLORS(115),
BMP_GRAY_COLORS(116),BMP_GRAY_COLORS(117),BMP_GRAY_COLORS(118),BMP_GRAY_COLORS(119),
BMP_GRAY_COLORS(120),BMP_GRAY_COLORS(121),BMP_GRAY_COLORS(122),BMP_GRAY_COLORS(123),
BMP_GRAY_COLORS(124),BMP_GRAY_COLORS(125),BMP_GRAY_COLORS(126),BMP_GRAY_COLORS(127),
BMP_GRAY_COLORS(128),BMP_GRAY_COLORS(129),BMP_GRAY_COLORS(130),BMP_GRAY_COLORS(131),
BMP_GRAY_COLORS(132),BMP_GRAY_COLORS(133),BMP_GRAY_COLORS(134),BMP_GRAY_COLORS(135),
BMP_GRAY_COLORS(136),BMP_GRAY_COLORS(137),BMP_GRAY_COLORS(138),BMP_GRAY_COLORS(139),
BMP_GRAY_COLORS(140),BMP_GRAY_COLORS(141),BMP_GRAY_COLORS(142),BMP_GRAY_COLORS(143),
BMP_GRAY_COLORS(144),BMP_GRAY_COLORS(145),BMP_GRAY_COLORS(146),BMP_GRAY_COLORS(147),
BMP_GRAY_COLORS(148),BMP_GRAY_COLORS(149),BMP_GRAY_COLORS(150),BMP_GRAY_COLORS(151),
BMP_GRAY_COLORS(152),BMP_GRAY_COLORS(153),BMP_GRAY_COLORS(154),BMP_GRAY_COLORS(155),
BMP_GRAY_COLORS(156),BMP_GRAY_COLORS(157),BMP_GRAY_COLORS(158),BMP_GRAY_COLORS(159),
BMP_GRAY_COLORS(160),BMP_GRAY_COLORS(161),BMP_GRAY_COLORS(162),BMP_GRAY_COLORS(163),
BMP_GRAY_COLORS(164),BMP_GRAY_COLORS(165),BMP_GRAY_COLORS(166),BMP_GRAY_COLORS(167),
BMP_GRAY_COLORS(168),BMP_GRAY_COLORS(169),BMP_GRAY_COLORS(170),BMP_GRAY_COLORS(171),
BMP_GRAY_COLORS(172),BMP_GRAY_COLORS(173),BMP_GRAY_COLORS(174),BMP_GRAY_COLORS(175),
BMP_GRAY_COLORS(176),BMP_GRAY_COLORS(177),BMP_GRAY_COLORS(178),BMP_GRAY_COLORS(179),
BMP_GRAY_COLORS(180),BMP_GRAY_COLORS(181),BMP_GRAY_COLORS(182),BMP_GRAY_COLORS(183),
BMP_GRAY_COLORS(184),BMP_GRAY_COLORS(185),BMP_GRAY_COLORS(186),BMP_GRAY_COLORS(187),
BMP_GRAY_COLORS(188),BMP_GRAY_COLORS(189),BMP_GRAY_COLORS(190),BMP_GRAY_COLORS(191),
BMP_GRAY_COLORS(192),BMP_GRAY_COLORS(193),BMP_GRAY_COLORS(194),BMP_GRAY_COLORS(195),
BMP_GRAY_COLORS(196),BMP_GRAY_COLORS(197),BMP_GRAY_COLORS(198),BMP_GRAY_COLORS(199),
BMP_GRAY_COLORS(200),BMP_GRAY_COLORS(201),BMP_GRAY_COLORS(202),BMP_GRAY_COLORS(203),
BMP_GRAY_COLORS(204),BMP_GRAY_COLORS(205),BMP_GRAY_COLORS(206),BMP_GRAY_COLORS(207),
BMP_GRAY_COLORS(208),BMP_GRAY_COLORS(209),BMP_GRAY_COLORS(210),BMP_GRAY_COLORS(211),
BMP_GRAY_COLORS(212),BMP_GRAY_COLORS(213),BMP_GRAY_COLORS(214),BMP_GRAY_COLORS(215),
BMP_GRAY_COLORS(216),BMP_GRAY_COLORS(217),BMP_GRAY_COLORS(218),BMP_GRAY_COLORS(219),
BMP_GRAY_COLORS(220),BMP_GRAY_COLORS(221),BMP_GRAY_COLORS(222),BMP_GRAY_COLORS(223),
BMP_GRAY_COLORS(224),BMP_GRAY_COLORS(225),BMP_GRAY_COLORS(226),BMP_GRAY_COLORS(227),
BMP_GRAY_COLORS(228),BMP_GRAY_COLORS(229),BMP_GRAY_COLORS(230),BMP_GRAY_COLORS(231),
BMP_GRAY_COLORS(232),BMP_GRAY_COLORS(233),BMP_GRAY_COLORS(234),BMP_GRAY_COLORS(235),
BMP_GRAY_COLORS(236),BMP_GRAY_COLORS(237),BMP_GRAY_COLORS(238),BMP_GRAY_COLORS(239),
BMP_GRAY_COLORS(240),BMP_GRAY_COLORS(241),BMP_GRAY_COLORS(242),BMP_GRAY_COLORS(243),
BMP_GRAY_COLORS(244),BMP_GRAY_COLORS(245),BMP_GRAY_COLORS(246),BMP_GRAY_COLORS(247),
BMP_GRAY_COLORS(248),BMP_GRAY_COLORS(249),BMP_GRAY_COLORS(250),BMP_GRAY_COLORS(251),
BMP_GRAY_COLORS(252),BMP_GRAY_COLORS(253),BMP_GRAY_COLORS(254),BMP_GRAY_COLORS(255),
};

const BITMAPRGBHEADER bmp_rgb_color_palette = {
	0xF800,
	0x07E0,
	0x001F,
	0,
};

BITMAPINFOHEADER bmih;



int SVBMP_Save(svbmp_file_t* fp, svbmp_img_t* img)
{
	if (img->format == PixelFormatGray) {
		bmih.bmfh.bfType = 0x4d42;//"BM"
		bmih.bmfh.bfSize = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPGRAYHEADER) + img->height * img->width;
		bmih.bmfh.bfReserved1 = 0;
		bmih.bmfh.bfReserved2 = 0;
		bmih.bmfh.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPGRAYHEADER);

		bmih.biSize = 40;
		bmih.biWidth = img->width;
		bmih.biHeight = -img->height;
		bmih.biPlanes = 1;
		bmih.biBitCount = 8;
		bmih.biCompression = 0;
		bmih.biSizeImage = img->height * img->width;
		bmih.biXPelsPerMeter = 12000;
		bmih.biYPelsPerMeter = 12000;
		bmih.biClrUsed = 0;
		bmih.biClrImportant = 0;
	}
	else if (img->format == PixelFormatRGB565)
	{
		bmih.bmfh.bfType = 0x4d42;//"BM"
		bmih.bmfh.bfSize = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPRGBHEADER) + img->height * img->width * 2;
		bmih.bmfh.bfReserved1 = 0;
		bmih.bmfh.bfReserved2 = 0;
		bmih.bmfh.bfOffBits = sizeof(BITMAPINFOHEADER) + sizeof(BITMAPRGBHEADER);

		bmih.biSize = 40;
		bmih.biWidth = img->width;
		bmih.biHeight = -img->height;
		bmih.biPlanes = 1;
		bmih.biBitCount = 16;
		bmih.biCompression = 3;//比特掩码压缩格式为RGB565
		bmih.biSizeImage = img->height * img->width * 2;
		bmih.biXPelsPerMeter = 12000;
		bmih.biYPelsPerMeter = 12000;
		bmih.biClrUsed = 0;
		bmih.biClrImportant = 0;
	}

	SVBMP_FileWrite(fp, &bmih, sizeof(BITMAPINFOHEADER));

	if (img->format == PixelFormatGray) {
		SVBMP_FileWrite(fp, &bmp_gray_color_palette, sizeof(BITMAPGRAYHEADER));
		SVBMP_FileWrite(fp, img->pImg, img->height * img->width);
	}
	else if (img->format == PixelFormatRGB565)
	{
		SVBMP_FileWrite(fp, &bmp_rgb_color_palette, sizeof(BITMAPRGBHEADER));
		SVBMP_FileWrite(fp, img->pImg, img->height * img->width * 2);
	}
	return 0;
}

/* @} */

#endif // ! HITSIC_USE_APP_SVBMP
